package com.example.config;

import com.example.interceptor.TimeInterceptor;
import org.apache.http.HttpEntity;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerTypePredicate;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * SpringMvc重写配置
 */
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {

    /**
     * 在 Spring MVC 中，重写 configurePathMatch(PathMatchConfigurer configurer)方法
     * 允许自定义 URL 路径匹配规则。
     * 以下是 PathMatchConfigurer的主要属性及其作用：
     * @param configurer
     */
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // 作用：是否忽略路径末尾斜杠（如 /users/→ /users）。SpringMvc默认为 true，SpringBoot默认为false
        // 适用场景：强制 URL 规范化，避免因斜杠导致重复路径。
        configurer.setUseTrailingSlashMatch(Boolean.TRUE); // 已弃用

        // 作用：控制是否开启后缀模式匹配（如 /user.json→ /user）。
        // 推荐实践：现代 API 设计中通常禁用，避免歧义（如 RESTful API 中 /users/1vs /users/1.json）。
        configurer.setUseSuffixPatternMatch(Boolean.TRUE); // 已弃用

        // 作用：为所有控制器方法添加统一前缀（常用于 API 版本控制）。(eg:@RequestMapping("/user") -> /api/user/...)
        // configurer.addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RequestMapping.class));


    }

    /**
     * 添加拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TimeInterceptor()) // 添加拦截器
                .addPathPatterns("/**") // 拦截映射规则
                .excludePathPatterns("/pages/**") // 设置排除拦截映射规则
                ;
    }

    /**
     * 全局CORS配置-跨域访问配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/user/*") // 映射服务器中的那些http接口运行跨域访问
                .allowedOrigins("http://localhost:8081") // 配置那些来源有权限跨域范围
                .allowedMethods( // 配置运行跨域访问的请求方法
                        HttpMethod.GET.name(),
                        HttpMethod.POST.name(),
                        HttpMethod.DELETE.name(),
                        HttpMethod.PUT.name()
                )
                ;
    }
}











